﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using Business;
using Entity;

namespace WebService
{
    /// <summary>
    /// Ce WebService fourni toutes les méthodes business relatives aux utilisateurs 
    /// nécessaires pour développer un client.
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // Pour autoriser l'appel de ce service Web depuis un script à l'aide d'ASP.NET AJAX, supprimez les marques de commentaire de la ligne suivante. 
    // [System.Web.Script.Services.ScriptService]
    public class UtilisateurWS : System.Web.Services.WebService
    {

        /// <summary>
        /// Créer un utilisateur.
        /// </summary>
        /// <param name="prenom">Prénom de l'utilisateur</param>
        /// <param name="nom">Nom de l'utilisateur</param>
        /// <param name="email">E-mail de l'utilisateur</param>
        /// <param name="password">Mot de passe de l'utilisateur</param>
        /// <param name="sexe">Sexe de l'utilisateur</param>
        /// <param name="filiere">Fillière de l'utilisateur</param>
        /// <param name="promotion">Promotion de l'utilisateur</param>
        /// <param name="datenaissance">Date de naissance de l'utilisateur</param>
        /// <returns>L'utilisateur créé</returns>
        [WebMethod]
        public static UtilisateurEWS creerUtilisateur(String prenom,
            String nom,
            String email,
            String password,
            char sexe,
            String filliere,
            int promotion,
            DateTime datenaissance)
        {
            Utilisateur utilisateur = UtilisateurService.creerUtilisateur(prenom, nom, email, password, sexe, filliere, promotion, datenaissance);
            if (utilisateur == null)
                return null;
            else
            {
                UtilisateurEWS utilisateurEWS = new UtilisateurEWS();
                utilisateurEWS.copyFromEntity(utilisateur);
                return utilisateurEWS;
            }
        }

        /// <summary>
        /// Met à jour un utilisateur.
        /// </summary>
        /// <param name="utilisateur">L'utilisateur à l'origine de la demande</param>
        /// <param name="idutilisateur">L'identifiant de l'utilisateur à modifier</param>
        /// <param name="prenom">Prénom de l'utilisateur</param>
        /// <param name="nom">Nom de l'utilisateur</param>
        /// <param name="email">E-mail de l'utilisateur</param>
        /// <param name="password">Mot de passe de l'utilisateur</param>
        /// <param name="sexe">Sexe de l'utilisateur</param>
        /// <param name="filiere">Fillière de l'utilisateur</param>
        /// <param name="promotion">Promotion de l'utilisateur</param>
        /// <param name="datenaissance">Date de naissance de l'utilisateur</param>
        [WebMethod]
        public void majUtilisateur(UtilisateurEWS utilisateurEWS,
            int idutilisateur,
            String prenom,
            String nom,
            String email,
            String password,
            char sexe,
            String filliere,
            int promotion,
            DateTime datenaissance)
        {
            // Conversion EWS vers Entity LINQ
            Utilisateur utilisateur = new Utilisateur();
            utilisateur.email = utilisateurEWS.email;
            utilisateur.password = utilisateurEWS.password;

            // On regarde si l'utilisateur veut bien modifier son profil
            if (DroitsService.aPourIdentifiant(utilisateur, idutilisateur))
                UtilisateurService.majUtilisateur(idutilisateur, prenom, nom, email, password, sexe, filliere, promotion, datenaissance);
        }

        /* Non utilisé.
         * Laissé ici au cas où.
        /// <summary>
        /// Supprime un utilisateur.
        /// </summary>
        /// <param name="utilisateur">L'utilisateur à l'origine de la demande</param>
        /// <param name="idutilisateur">L'identifiant de l'utilisateur à supprimer</param>
        [WebMethod]
        public void supprimerUtilisateur(UtilisateurEWS utilisateurEWS, int idutilisateur)
        {
            // Conversion EWS vers Entity LINQ
            Utilisateur utilisateur = new Utilisateur();
            utilisateur.email = utilisateurEWS.email;
            utilisateur.password = utilisateurEWS.password;

            // On regarde si l'utilisateur veut bien supprimer son profil
            if (DroitsService.aPourIdentifiant(utilisateur, idutilisateur))
                UtilisateurService.supprimerUtilisateur(idutilisateur);
        }*/

        /// <summary>
        /// Retourne les informations d'un utilisateur par son identifiant.
        /// </summary>
        /// <param name="utilisateur">L'utilisateur à l'origine de la demande</param>
        /// <param name="idutilisateur">L'identifiant de l'utilisateur.</param>
        /// <returns>L'utilisateur recherché, ou null s'il n'existe pas</returns>
        [WebMethod]
        public UtilisateurEWS getUtilisateur(UtilisateurEWS utilisateurEWS, int idutilisateur)
        {
            // Conversion EWS vers Entity LINQ
            Utilisateur utilisateur = new Utilisateur();
            utilisateur.email = utilisateurEWS.email;
            utilisateur.password = utilisateurEWS.password;

            // On regarde s'il a le droit d'obtenir les informations
            if (DroitsService.estAmisAvec(utilisateur, idutilisateur))
            {
                utilisateur = UtilisateurService.getUtilisateur(idutilisateur);
                if (utilisateur == null)
                    return null;
                else
                {
                    utilisateurEWS = new UtilisateurEWS();
                    utilisateurEWS.copyFromEntity(utilisateur);
                    return utilisateurEWS;
                }
            }
            else
                return null;
        }

        /// <summary>
        /// Methode pour effectuer une recherche sur les utilisateurs
        /// </summary>
        /// <param name="recherche">champ de recherche</param>
        /// <returns></returns>
        [WebMethod]
        public List<UtilisateurEWS> rechercherUtilisateurs(string recherche)
        {
            // Conversion EWS vers Entity LINQ
            List<Utilisateur> listUtilisateurs = UtilisateurService.rechercherUtilisateurs(recherche);
            List<UtilisateurEWS> listUtilisateursEWS = new List<UtilisateurEWS>();
            if (listUtilisateurs != null)
            {
                foreach (Utilisateur utilisateur in listUtilisateurs)
                    listUtilisateursEWS.Add(new UtilisateurEWS(utilisateur));

                return listUtilisateursEWS;
            }
            else
                return null;
        }

        /// <summary>
        /// Retourne les informations d'un utilisateur par son identifiant.
        /// </summary>
        /// <param name="utilisateur">L'utilisateur à l'origine de la demande</param>
        /// <param name="idutilisateur">L'identifiant de l'utilisateur.</param>
        /// <returns>L'utilisateur recherché, ou null s'il n'existe pas</returns>
        [WebMethod]
        public UtilisateurEWS getAffichageUtilisateur(int idutilisateur)
        {
            Utilisateur utilisateur = UtilisateurService.getUtilisateur(idutilisateur);
            if (utilisateur == null)
                return null;
            else
            {
                UtilisateurEWS utilisateurEWS = new UtilisateurEWS();
                utilisateurEWS.copyLimitedFromEntity(utilisateur);
                return utilisateurEWS;
            }
        }

        /// <summary>
        /// Retourne les informations d'un utilisateur par son email et mot de passe.
        /// </summary>
        /// <param name="email">L'email de l'utilisateur</param>
        /// <param name="password">Le mot de passe de l'utilisateur</param>
        /// <returns>L'utilisateur ou alors null s'il n'existe pas</returns>
        [WebMethod]
        public UtilisateurEWS connexionUtilisateur(String email, String password)
        {
            Utilisateur utilisateur = UtilisateurService.getUtilisateur(email, password);
            if (utilisateur == null)
                return null;
            else
            {
                UtilisateurEWS utilisateurEWS = new UtilisateurEWS();
                utilisateurEWS.copyFromEntity(utilisateur);
                return utilisateurEWS;
            }
        }

        /// <summary>
        /// Indique si l'e-mail est déjà enregistré sur un utilisateur.
        /// </summary>
        /// <param name="email">L'email de l'utilisateur</param>
        /// <returns>true si l'e-mail existe en base, false sinon</returns>
        public bool emailExiste(String email)
        {
            return UtilisateurService.emailExiste(email);
        }

        /// <summary>
        /// Retourne l'age de l'utilisateur en fonction de sa date de naissance
        /// </summary>
        /// <param name="datenaissance"></param>
        /// <returns></returns>
        [WebMethod]
        public int calculerAge(DateTime datenaissance)
        {
            return Outils.calculerAge(datenaissance);
        }
    }
}
